package com.example.jdbc_test.dao.impl;

import com.example.jdbc_test.dao.HandlerDao;
import com.example.jdbc_test.pojo.Staff;
import com.example.jdbc_test.util.DruidDbUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*;

import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

/**
 * @ClassName HandlerDaoImpl
 * @Description TODO
 * @Author Kx
 * @Date 2025/2/27 10:47
 * @Version 1.0
 */
public class HandlerDaoImpl implements HandlerDao {

    // 创建日期记录器
    private static final Logger logger = Logger.getLogger(HandlerDaoImpl.class.getName());

    /**
     * @description: 根据编号查询员工信息
     * @author: Kx
     * @date: 2025/2/27 10:56
     * @param: [id 员工编号]
     * @return: java.util.Map<java.lang.String,java.lang.Object> 员工信息
     **/
    @Override
    public Map<String, Object> queryStaffById(int id) {
        // 1. 定义 SQL 语句
        String sql = "select id,name,age,phone,sta_pos as staPos,add_time as addTime,update_time as updateTime from staffs where id = ?";

        // 2. 创建 DbUtil 工具类的 SQL 执行器
        QueryRunner queryRunner = new QueryRunner(DruidDbUtil.getDataSource());

        Map<String,Object> query = null;

        // 3. 执行 SQL 语句
        try {
            query = queryRunner.query(sql, new MapHandler(), id);
        } catch (SQLException e) {
            logger.severe("执行SQL语句失败" + e.getMessage());
        }
        return query;
    }

    /**
     * @description: 查询所有员工信息
     * @author: Kx
     * @date: 2025/2/27 11:05
     * @param: []
     * @return: java.util.List<java.util.Map<java.lang.String,java.lang.Object>> 员工信息
     **/
    @Override
    public List<Map<String, Object>> queryStaffAll() {
        // 1. 定义 SQL 语句
        String sql = "select id,name,age,phone,sta_pos as staPos,add_time as addTime,update_time as updateTime from staffs";

        // 2. 创建 DbUtil 工具类的 SQL 执行器
        QueryRunner queryRunner = new QueryRunner(DruidDbUtil.getDataSource());

        List<Map<String,Object>> query = null;

        // 3. 执行 SQL 语句
        try {
            query = queryRunner.query(sql,new MapListHandler());
        } catch (SQLException e) {
            logger.severe("执行SQL语句失败" + e.getMessage());
        }
        return query;
    }

    /**
     * @description: 根据编号查询员工姓名
     * @author: Kx
     * @date: 2025/2/27 11:22
     * @param: [id 员工编号]
     * @return: java.lang.String 员工姓名
     **/
    @Override
    public String queryStaffNameById(int id) {
        // 1. 定义 SQL 语句
        String sql = "select name from staffs where id = ?";

        // 2. 创建 DbUtil 工具类的 SQL 执行器
        QueryRunner queryRunner = new QueryRunner(DruidDbUtil.getDataSource());

        Staff query = null;

        // 3. 执行 SQL 语句
        try {
            query = queryRunner.query(sql, new BeanHandler<>(Staff.class) , id);
        } catch (SQLException e) {
            logger.severe("执行SQL语句失败" + e.getMessage());
        }
        return query.getName();
    }

    /**
     * @description: 查询员工数量
     * @author: Kx
     * @date: 2025/2/27 11:39
     * @param: []
     * @return: long 员工记录数
     **/
    @Override
    public long queryStaffCount() {
        // 1. 定义 SQL 语句
        String sql = "select count(*) from staffs";

        // 2. 创建 DbUtil 工具类的 SQL 执行器
        QueryRunner queryRunner = new QueryRunner(DruidDbUtil.getDataSource());

        Object query = null;

        // 3. 执行 SQL 语句
        try {
            query = queryRunner.query(sql, new ScalarHandler<>());
        } catch (SQLException e) {
            logger.severe("执行SQL语句失败" + e.getMessage());
        }
        // 先把Object类型转换成String类型,再转换成Long包装类类型
        return Long.parseLong(String.valueOf(query));
    }

    /**
     * @description: 查询所有员工姓名
     * @author: Kx
     * @date: 2025/2/27 11:47
     * @param: []
     * @return: java.util.List<java.lang.String> 返回所有员工姓名
     **/
    @Override
    public List<String> queryStaffName() {
        // 1. 定义 SQL 语句
        String sql = "select name from staffs";

        // 2. 创建 DbUtil 工具类的 SQL 执行器
        QueryRunner queryRunner = new QueryRunner(DruidDbUtil.getDataSource());

        List<String> query = null;

        // 3. 执行 SQL 语句
        try {
            query = queryRunner.query(sql, new ColumnListHandler<>());
        } catch (SQLException e) {
            logger.severe("执行SQL语句失败" + e.getMessage());
        }
        return query;
    }

    /**
     * @description: 根据员工编号查询员工姓名
     * @author: Kx
     * @date: 2025/2/27 11:54
     * @param: [ids 员工编号数组]
     * @return: java.lang.Object[] 员工信息
     **/
    @Override
    public Object[] queryStaffNameByIds(int[] ids) {
        // 1. 定义 SQL 语句
        String sql = "select * from staffs where id = ?";

        // 2. 创建 DbUtil 工具类的 SQL 执行器
        QueryRunner queryRunner = new QueryRunner(DruidDbUtil.getDataSource());

        Object[] query = null;

        // 3. 执行 SQL 语句
        try {
            for (int id : ids) {
                query = queryRunner.query(sql, new ArrayHandler(), id);
            }
        } catch (SQLException e) {
            logger.severe("执行SQL语句失败" + e.getMessage());
        }
        return query;
    }

    /**
     * @description: 查询所有员工信息
     * @author: Kx
     * @date: 2025/2/27 13:31
     * @param: []
     * @return: java.util.List<java.lang.Object[]> 所有员工信息
     **/
    @Override
    public List<Object[]> queryStaffArrayAll() {
        // 1. 定义 SQL 语句
        String sql = "select * from staffs";

        // 2. 创建 DbUtil 工具类的 SQL 执行器
        QueryRunner queryRunner = new QueryRunner(DruidDbUtil.getDataSource());

        List<Object[]> query = null;

        // 3. 执行 SQL 执行器
        try {
            query = queryRunner.query(sql, new ArrayListHandler());
        } catch (SQLException e) {
            logger.severe("执行SQL语句失败" + e.getMessage());
        }
        return query;
    }
}
